package com.cotasul.tela;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import org.primefaces.context.RequestContext;

import com.cotasul.bean.CompradorBean;
import com.cotasul.bean.CotacaoBean;
import com.cotasul.bean.FornecedorBean;
import com.cotasul.bean.ItemOrcamentoBean;
import com.cotasul.bean.OrcamentoBean;
import com.cotasul.bean.UsuarioBean;
import com.cotasul.negocio.CompradorServico;
import com.cotasul.negocio.CotacaoServico;
import com.cotasul.negocio.FornecedorServico;
import com.cotasul.negocio.OrcamentoServico;
import com.cotasul.negocio.excecoes.EmailException;
import com.cotasul.negocio.interfaces.IServicoGenerico;
import com.cotasul.util.Ferramentas;

@ManagedBean
@ViewScoped
public class ListaOrcamentoTela extends TelaAbstrata {

	private List<OrcamentoBean> listaOrcamentos;

	private List<CotacaoBean> listaCotacoes;

	private List<ItemOrcamentoBean> listaItens;

	private UsuarioBean usuario;

	private OrcamentoServico<OrcamentoBean> orcamentoServico;

	private String dataDe;

	private String dataAte;

	private String numero;

	private OrcamentoBean orcamento;

	// private FornecedorBean fornecedor;
	@ManagedProperty(value = "#{compradorBean}")
	private CompradorBean comprador;

	private CotacaoBean cotacao;

	private CotacaoServico<CotacaoBean> cotacaoServico;

	private FornecedorServico<FornecedorBean> fornecedorServico;

	private CompradorServico<CompradorBean> compradorServico;

	private ItemOrcamentoBean item;

	private String statusFiltro;

	private FacesMessage msg;

	private List<FornecedorBean> listaFornecedores;

	private Map<String, String> param;

	public ListaOrcamentoTela() {

		try {
			usuario = usuario == null ? (UsuarioBean) ((HttpSession) FacesContext
					.getCurrentInstance().getExternalContext()
					.getSession(false)).getAttribute("usuario")
					: usuario;
			compradorServico = new CompradorServico<CompradorBean>();
			cotacaoServico = new CotacaoServico<CotacaoBean>();
//			comprador = new CompradorBean();
//			comprador.setUsuario(usuario);
//			comprador = compradorServico.buscaComprador(usuario);
			fornecedorServico = new FornecedorServico<FornecedorBean>();
			// fornecedor = new FornecedorBean();
			// fornecedor.setUsuario(usuario);
			// fornecedor = fornecedorServico.buscaFornecedor(fornecedor);
			cotacao = new CotacaoBean();
			listaOrcamentos = new ArrayList<OrcamentoBean>();
			listaCotacoes = new ArrayList<CotacaoBean>();
			listaItens = new ArrayList<ItemOrcamentoBean>();
			param = new HashMap<String, String>();

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void filtraOrcamentos() {
		try {
			orcamentoServico = new OrcamentoServico<OrcamentoBean>();
			orcamento = new OrcamentoBean();
			if (!"".equals(dataDe.trim())) {
				orcamento.setDataEmissao(Ferramentas.formataData(dataDe,
						"dd/MM/yy"));
			}
			if (!"".equals(dataAte.trim())) {
				orcamento.setDataValidade(Ferramentas.formataData(dataAte,
						"dd/MM/yy"));
			}
			if (numero.trim().equals("")) {
				orcamento.setNumero((long) 0);
			} else {
				orcamento.setNumero(Long.parseLong(numero));
			}
			orcamento.setStatus(statusFiltro);

			listaOrcamentos = orcamentoServico.filtraOrcamento(orcamento,
					comprador);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void preencheListaCotacao(ItemOrcamentoBean item) {
		try {
			cotacao = new CotacaoBean();
			cotacao.setItemOrcamento(item);
			cotacaoServico = new CotacaoServico<CotacaoBean>();
			listaCotacoes = cotacaoServico.buscaCotacoes(cotacao);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void aprovaCotacoesFornecedor(List<CotacaoBean> cotacoes) {
		String email = null;
		FacesMessage msg2 = null;
		try {
			String idItem = "";
			for (CotacaoBean cotacao : cotacoes) {
				this.cotacaoServico.aprovaCotacao(cotacao);
				email = cotacao.getFornecedor().getEmail();
				idItem += cotacao.getItemOrcamento().getNumero() + ",";
			}
			filtraOrcamentos();
			msg = new FacesMessage(FacesMessage.SEVERITY_INFO, this
					.getServico().getValor("msg_header_sucesso"), this
					.getServico().getValor("msg_sucesso_cotacao"));
			Ferramentas.enviaEmail("Você possui cotação(ões) aprovada(s).",
					"Cotação Aprovada", email);
			param.put("IDITEM", idItem.substring(0, idItem.length() - 1));
			Ferramentas.enviaEmail("Sua cotação foi encerrada.",
					"Cotação Encerrada", fornecedorServico.buscaEmails(param));
			RequestContext.getCurrentInstance().execute(
					"dlgCotacaoFornecedores.hide()");
		} catch (EmailException e1) {
			msg2 = new FacesMessage(FacesMessage.SEVERITY_ERROR, this
					.getServico().getValor("msg_header_erro"), this
					.getServico().getValor("msg_erro_email"));
			FacesContext.getCurrentInstance().addMessage(null, msg2);
			RequestContext.getCurrentInstance().execute(
					"dlgCotacaoFornecedores.hide()");
		} catch (Exception e2) {
			msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, this
					.getServico().getValor("msg_header_erro"), this
					.getServico().getValor("msg_erro_cotacao"));
			e2.printStackTrace();
		}
		FacesContext.getCurrentInstance().addMessage(null, msg);

	}

	public void preecheListaCotacaoFornecedor(OrcamentoBean orcamento) {
		try {
			listaFornecedores = this.fornecedorServico
					.buscaOrcamentosFornecedor(orcamento);
			// Collections.sort(listaFornecedores);
			Collections.sort(listaFornecedores,
					new Comparator<FornecedorBean>() {
						@Override
						public int compare(FornecedorBean o1, FornecedorBean o2) {
							return o1.getValorTotal().compareTo(
									o2.getValorTotal());
						}
					});

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void aprovaCotacao() {
		try {

			cotacaoServico.aprovaCotacao(cotacao);
			Ferramentas.enviaEmail("Sua cotação foi aprovada.",
					"Cotação Aprovada", cotacao.getFornecedor().getEmail());
			param.put("IDITEM", cotacao.getItemOrcamento().getNumero() + "");
			String email = fornecedorServico.buscaEmails(param);
			if (email != null && !"".equals(email)) {
				Ferramentas.enviaEmail("Sua cotação foi encerrada.",
						"Cotação Encerrada", email);
			}
			filtraOrcamentos();
			msg = new FacesMessage(FacesMessage.SEVERITY_INFO, this
					.getServico().getValor("msg_header_sucesso"), this
					.getServico().getValor("msg_sucesso_cotacao"));
		} catch (Exception e) {
			msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, this
					.getServico().getValor("msg_header_erro"), this
					.getServico().getValor("msg_erro_cotacao"));
			e.printStackTrace();
		} finally {
			FacesContext.getCurrentInstance().addMessage(null, msg);
		}
	}

	@SuppressWarnings("rawtypes")
	@Override
	protected IServicoGenerico getServico() {
		return this.orcamentoServico;
	}

	public List<OrcamentoBean> getListaOrcamentos() {
		return listaOrcamentos;
	}

	public void setListaOrcamentos(List<OrcamentoBean> listaOrcamentos) {
		this.listaOrcamentos = listaOrcamentos;
	}

	public UsuarioBean getUsuario() {
		return usuario;
	}

	public void setUsuario(UsuarioBean usuario) {
		this.usuario = usuario;
	}

	public OrcamentoServico<OrcamentoBean> getOrcamentoServico() {
		return orcamentoServico;
	}

	public void setOrcamentoServico(
			OrcamentoServico<OrcamentoBean> orcamentoServico) {
		this.orcamentoServico = orcamentoServico;
	}

	public String getDataDe() {
		return dataDe;
	}

	public void setDataDe(String dataDe) {
		this.dataDe = dataDe;
	}

	public String getDataAte() {
		return dataAte;
	}

	public void setDataAte(String dataAte) {
		this.dataAte = dataAte;
	}

	public String getNumero() {
		return numero;
	}

	public void setNumero(String numero) {
		this.numero = numero;
	}

	public OrcamentoBean getOrcamento() {
		return orcamento;
	}

	public void setOrcamento(OrcamentoBean orcamento) {
		this.orcamento = orcamento;
	}

	public CotacaoBean getCotacao() {
		return cotacao;
	}

	public void setCotacao(CotacaoBean cotacao) {
		this.cotacao = cotacao;
	}

	public CotacaoServico<CotacaoBean> getCotacaoServico() {
		return cotacaoServico;
	}

	public void setCotacaoServico(CotacaoServico<CotacaoBean> cotacaoServico) {
		this.cotacaoServico = cotacaoServico;
	}

	public ItemOrcamentoBean getItem() {
		return item;
	}

	public void setItem(ItemOrcamentoBean item) {
		this.item = item;
	}

	public String getStatusFiltro() {
		return statusFiltro;
	}

	public void setStatusFiltro(String statusFiltro) {
		this.statusFiltro = statusFiltro;
	}

	public List<CotacaoBean> getListaCotacoes() {
		return listaCotacoes;
	}

	public void setListaCotacoes(List<CotacaoBean> listaCotacoes) {
		this.listaCotacoes = listaCotacoes;
	}

	public List<ItemOrcamentoBean> getListaItens() {
		return listaItens;
	}

	public void setListaItens(List<ItemOrcamentoBean> listaItens) {
		this.listaItens = listaItens;
	}

	public CompradorBean getComprador() {
		return comprador;
	}

	public void setComprador(CompradorBean comprador) {
		this.comprador = comprador;
	}

	public CompradorServico<CompradorBean> getCompradorServico() {
		return compradorServico;
	}

	public void setCompradorServico(
			CompradorServico<CompradorBean> compradorServico) {
		this.compradorServico = compradorServico;
	}

	public FornecedorServico<FornecedorBean> getFornecedorServico() {
		return fornecedorServico;
	}

	public void setFornecedorServico(
			FornecedorServico<FornecedorBean> fornecedorServico) {
		this.fornecedorServico = fornecedorServico;
	}

	public FacesMessage getMsg() {
		return msg;
	}

	public void setMsg(FacesMessage msg) {
		this.msg = msg;
	}

	public List<FornecedorBean> getListaFornecedores() {
		return listaFornecedores;
	}

	public void setListaFornecedores(List<FornecedorBean> listaFornecedores) {
		this.listaFornecedores = listaFornecedores;
	}

}
